﻿using System.Collections.Generic;
using System.Linq;
using System.Text;
using MapasDoGoogle.Tipos;
using NUnit.Framework;

namespace MapasDoGoogle.Teste
{
    [TestFixture]
    public class MapaEstaticoTeste
    {
        [Test]
        public void DeveGerarUrlComParamentrosCenterZoomSizeEhSensor()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Center("Av Brasil,sao paulo,sp")
                .Zoom(15)
                .Size(500, 400)
                .Sensor(false)
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?center=Av+Brasil,sao+paulo,sp&zoom=15&size=500x400&sensor=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void DeveGerarUrlComParamentrosCenterZoomSizeEhSensorComDominioAlterado()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Center("Av Brasil,sao paulo,sp")
                .Zoom(15)
                .Size(500, 400)
                .Sensor(false)
                .Url("http://teste.com/")
                .Criar();

            const string esperado = "http://teste.com/?center=Av+Brasil,sao+paulo,sp&zoom=15&size=500x400&sensor=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void DeveGerarUrlComParamentrosCenterZoomSizeSensorEhMaptype()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Center("Av Brasil,sao paulo,sp")
                .Zoom(15)
                .Size(500, 400)
                .Sensor(false)
                .Maptype(Maptype.Roadmap)
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?center=Av+Brasil,sao+paulo,sp&zoom=15&size=500x400&sensor=false&maptype=roadmap";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void DeveGerarUrlComParamentrosCenterZoomSizeSensorEhFormat()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Center("Av Brasil,sao paulo,sp")
                .Zoom(15)
                .Size(500, 400)
                .Sensor(false)
                .Format(Format.GIF)
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?center=Av+Brasil,sao+paulo,sp&zoom=15&size=500x400&sensor=false&format=gif";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void DeveGerarUrlComParamentrosCenterZoomSizeSensorEhMobile()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Center("Av Brasil,sao paulo,sp")
                .Zoom(15)
                .Size(500, 400)
                .Sensor(false)
                .Mobile(false)
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?center=Av+Brasil,sao+paulo,sp&zoom=15&size=500x400&sensor=false&mobile=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void DeveGerarUrlComParamentrosCenterZoomSizeSensorEhLanguage()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Center("Av Brasil,sao paulo,sp")
                .Zoom(15)
                .Size(500, 400)
                .Sensor(false)
                .Language("pt-br")
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?center=Av+Brasil,sao+paulo,sp&zoom=15&size=500x400&sensor=false&language=pt-br";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void DeveGerarUrlComParamentrosSizeSensorEhMarkers()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Size(500, 400)
                .Markers(Color.Purple, Size.Mid, 'C', 11211, 11206, 11222)
                .Sensor(false)
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?size=500x400&markers=color:purple|size:mid|label:C|11211|11206|11222&sensor=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void DeveGerarUrlComParamentrosSizeSensorEhMarkersComFormatacaoEmColorEhSize()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Size(500, 400)
                .Markers(Color.Purple, Size.Mid, 11211, 11206, 11222)
                .Sensor(false)
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?size=500x400&markers=color:purple|size:mid|11211|11206|11222&sensor=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void DeveGerarUrlComParamentrosSizeSensorEhMarkersComFormatacaoEmColor()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Size(500, 400)
                .Markers(Color.Purple, 11211, 11206, 11222)
                .Sensor(false)
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?size=500x400&markers=color:purple|11211|11206|11222&sensor=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void DeveGerarUrlComParamentrosSizeSensorEhMarkersComFormatacaoEmColorEhLabel()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Size(500, 400)
                .Markers(Color.Purple, 'A', 11211, 11206, 11222)
                .Sensor(false)
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?size=500x400&markers=color:purple|label:A|11211|11206|11222&sensor=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void DeveGerarUrlComParamentrosSizeSensorEhMarkersComFormatacaoEmSizeEhLabel()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Size(500, 400)
                .Markers(Size.Small, 'A', 11211, 11206, 11222)
                .Sensor(false)
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?size=500x400&markers=size:small|label:A|11211|11206|11222&sensor=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void DeveGerarUrlComParamentrosSizeSensorEhMarkersComFormatacaoEmSize()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Size(500, 400)
                .Markers(Size.Small, 11211, 11206, 11222)
                .Sensor(false)
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?size=500x400&markers=size:small|11211|11206|11222&sensor=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void DeveGerarUrlComParamentrosSizeSensorEhMarkersComFormatacaoEmLabel()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Size(500, 400)
                .Markers('B', 11211, 11206, 11222)
                .Sensor(false)
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?size=500x400&markers=label:B|11211|11206|11222&sensor=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void DeveGerarUrlComParamentrosSizeSensorEhMarkersComLocationEmString()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Size(500, 400)
                .Markers(Color.Purple, Size.Mid, 'C', "Av Brasil,45,sao paulo,sp",
                "Av Brasil,900,sao paulo,sp",
                "Av Nove de Julho,900,sao paulo,sp")
                .Sensor(false)
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?size=500x400&markers=color:purple|size:mid|label:C|Av+Brasil,45,sao+paulo,sp|Av+Brasil,900,sao+paulo,sp|Av+Nove+de+Julho,900,sao+paulo,sp&sensor=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void DeveGerarUrlComParamentrosSizeSensorEhPath()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Size(500, 400)
                .Sensor(false)
                .Path(Color.Blue, 5,
                new Localizacao<double> { PontoIncial = 40.737102, PontoFinal = -73.990318 },
                new Localizacao<double> { PontoIncial = 40.749825, PontoFinal = -73.987963 },
                new Localizacao<double> { PontoIncial = 40.752946, PontoFinal = -73.987384 },
                new Localizacao<double> { PontoIncial = 40.755823, PontoFinal = -73.986397 })
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?size=500x400&sensor=false&path=color:blue|weight:5|40.737102,-73.990318|40.749825,-73.987963|40.752946,-73.987384|40.755823,-73.986397";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void NaoDeveRepetirOhParametroCenter()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Center("Av Brasil,sao paulo,sp")
                .Zoom(15)
                .Size(500, 400)
                .Center("Av Paulista,sao paulo,sp")
                .Sensor(false)
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?center=Av+Brasil,sao+paulo,sp&zoom=15&size=500x400&sensor=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void NaoDeveRepetirOhParametroZoom()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Center("Av Brasil,sao paulo,sp")
                .Zoom(15)
                .Size(500, 400)
                .Sensor(false)
                .Zoom(14)
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?center=Av+Brasil,sao+paulo,sp&zoom=15&size=500x400&sensor=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void NaoDeveRepetirOhParametroSensor()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Center("Av Brasil,sao paulo,sp")
                .Sensor(false)
                .Zoom(15)
                .Size(500, 400)
                .Sensor(true)
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?center=Av+Brasil,sao+paulo,sp&sensor=false&zoom=15&size=500x400";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void NaoDeveRepetirOhParametroSize()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Center("Av Brasil,sao paulo,sp")
                .Size(500, 500)
                .Zoom(15)
                .Size(500, 400)
                .Sensor(false)
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?center=Av+Brasil,sao+paulo,sp&size=500x500&zoom=15&sensor=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void NaoDeveRepetirOhParametroMaptype()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                  .Center("Av Brasil,sao paulo,sp")
                  .Maptype(Maptype.Roadmap)
                  .Zoom(15)
                  .Size(500, 400)
                  .Sensor(false)
                  .Maptype(Maptype.Hybrid)
                  .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?center=Av+Brasil,sao+paulo,sp&maptype=roadmap&zoom=15&size=500x400&sensor=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void NaoDeveRepetirOhParametroFormat()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Center("Av Brasil,sao paulo,sp")
                .Format(Format.GIF)
                .Zoom(15)
                .Size(500, 400)
                .Sensor(false)
                .Format(Format.JPEG)
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?center=Av+Brasil,sao+paulo,sp&format=gif&zoom=15&size=500x400&sensor=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void NaoDeveRepetirOhParametroMobile()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Center("Av Brasil,sao paulo,sp")
                .Mobile(false)
                .Zoom(15)
                .Size(500, 400)
                .Sensor(false)
                .Mobile(true)
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?center=Av+Brasil,sao+paulo,sp&mobile=false&zoom=15&size=500x400&sensor=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void NaoDeveRepetirOhParametroLanguage()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Center("Av Brasil,sao paulo,sp")
                .Zoom(15)
                .Language("pt-br")
                .Size(500, 400)
                .Sensor(false)
                .Language("en-us")
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?center=Av+Brasil,sao+paulo,sp&zoom=15&language=pt-br&size=500x400&sensor=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void NaoDeveRepetirOhParametroMarkers()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Markers(Color.Purple, Size.Mid, 'C', 11211, 11206, 11222)
                .Size(500, 400)
                .Markers(Color.Gray, Size.Small, 'A', 11211, 11206, 11222)
                .Sensor(false)
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?markers=color:purple|size:mid|label:C|11211|11206|11222&size=500x400&sensor=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        public void NaoDeveRepetirOhParametroPath()
        {
            var mapaEstatico = new MapaEstatico();

            var resultado = mapaEstatico
                .Size(500, 400)
                 .Path(Color.Blue, 5,
                new Localizacao<double> { PontoIncial = 40.737102, PontoFinal = -73.990318 },
                new Localizacao<double> { PontoIncial = 40.749825, PontoFinal = -73.987963 },
                new Localizacao<double> { PontoIncial = 40.752946, PontoFinal = -73.987384 },
                new Localizacao<double> { PontoIncial = 40.755823, PontoFinal = -73.986397 })
                .Sensor(false)
                .Path(Color.Blue, 5,
                new Localizacao<double> { PontoIncial = 40.737102, PontoFinal = 73.990318 },
                new Localizacao<double> { PontoIncial = 40.749825, PontoFinal = 73.987963 },
                new Localizacao<double> { PontoIncial = 40.752946, PontoFinal = 73.987384 },
                new Localizacao<double> { PontoIncial = 40.755823, PontoFinal = 73.986397 })
                .Criar();

            const string esperado = "http://maps.google.com/maps/api/staticmap?size=500x400&path=color:blue|weight:5|40.737102,-73.990318|40.749825,-73.987963|40.752946,-73.987384|40.755823,-73.986397&sensor=false";

            Assert.AreEqual(esperado, resultado);
        }

        [Test]
        [ExpectedException(ExpectedException = typeof(MapaEstaticoException),
            ExpectedMessage = "Informe pelo menos um dos seguintes parâmetros: Center,Markers ou Path.")]
        public void QuandoParametroCenterMarkersOuPathNaoForInformado()
        {
            var mapaEstatico = new MapaEstatico();

            mapaEstatico
              .Size(500, 400)
              .Sensor(false)
              .Criar();
        }

        [Test]
        [ExpectedException(ExpectedException = typeof(MapaEstaticoException),
            ExpectedMessage = "O parâmetro Size é obrigatório.")]
        public void QuandoParametroSizeNaoForInformado()
        {
            var mapaEstatico = new MapaEstatico();

            mapaEstatico
              .Center("Av Brasil,sao paulo,sp")
              .Sensor(false)
              .Criar();
        }

        [Test]
        [ExpectedException(ExpectedException = typeof(MapaEstaticoException),
            ExpectedMessage = "O parâmetro Sensor é obrigatório.")]
        public void QuandoParametroSensorNaoForInformado()
        {
            var mapaEstatico = new MapaEstatico();

            mapaEstatico
                .Size(500, 400)
                .Center("Av Brasil,sao paulo,sp")
              .Criar();
        }
    }
}
